<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>映射 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'mapping.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/mapping.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/mapping.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/mapping.html" rel="nofollow" target="_blank">../en/mapping.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-node">映射</span>
</div>
<div class="navheader">
<span class="prev">
<a href="modules-scripting-engine.html">« 高级脚本使用脚本引擎</a>
</span>
<span class="next">
<a href="removal-of-types.html">删除的映射类型 »</a>
</span>
</div>
<div class="part">
<div class="titlepage"><div><div>
<h1 class="title">
<a id="mapping"></a>映射(mapping)
</h1>
</div></div></div>
<div class="openblock partintro">
<div class="content">
<p>
映射(mapping)是定义如何存储和索引文档及其包含的字段的过程。

例如，可以使用映射来定义：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
哪些字符串字段应被视为全文字段。
</li>
<li class="listitem">
哪些字段包含数字、日期或地理位置。
</li>
<li class="listitem">
日期值的<a class="xref" href="mapping-date-format.html" title="格式" rel="nofollow">格式(format)</a>
。</li>
<li class="listitem">
控制<a class="xref" href="dynamic-mapping.html" title="Dynamic Mapping">动态添加字段</a>映射的自定义规则。
</li>
</ul>
</div>
<p>映射的定义具有：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<a class="xref" href="mapping-fields.html" title="元字段" rel="nofollow">元字段(meta-fields)</a>
</span>
</dt>
<dd>
元字段(meta-fields)用于定制如何处理文档关联的元数据。

元字段的例子包括文档的 <a class="xref" href="mapping-index-field.html" title="_index字段" rel="nofollow"><code class="literal">_index</code></a>、<a class="xref" href="mapping-id-field.html" title="_id字段" rel="nofollow"><code class="literal">_id</code></a> 及 <a class="xref" href="mapping-source-field.html" title="_source字段" rel="nofollow"><code class="literal">_source</code></a>字段。
</dd>
<dt>
<span class="term">
<a class="xref" href="mapping-types.html" title="Field datatypes">字段(fields)</a>或<em>属性(properties)</em>
</span>
</dt>
<dd>
映射包含与文档相关的 字段(field) 或 属性(<code class="literal">properties</code>) 的列表。
</dd>
</dl>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
在7.0.0之前，<em>mappings</em>定义曾经包含 type。

更多信息请参考 <a class="xref" href="removal-of-types.html" title="删除的映射类型"><em>删除的映射类型</em></a>。
</p>
</div>
</div>
<h2>
<a id="field-datatypes"></a>字段数据类型
</h2>
<p>每个字段都有一个数据类型(<code class="literal">type</code>)，可以是：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
简单类型，如<a class="xref" href="text.html" title="text 数据类型" rel="nofollow"><code class="literal">text</code></a>、<a class="xref" href="keyword.html" title="keyword 数据类型" rel="nofollow"><code class="literal">keyword</code></a>、<a class="xref" href="date.html" title="date 数据类型" rel="nofollow"><code class="literal">date</code></a>、<a class="xref" href="number.html" title="numeric 数据类型" rel="nofollow"><code class="literal">long</code></a>、<a class="xref" href="number.html" title="numeric 数据类型" rel="nofollow"><code class="literal">double</code></a>、<a class="xref" href="boolean.html" title="boolean 数据类型" rel="nofollow"><code class="literal">boolean</code></a> 及 <a class="xref" href="ip.html" title="ip 数据类型" rel="nofollow"><code class="literal">ip</code></a>。
</li>
<li class="listitem">
支持JSON分层性质的类型，如<a class="xref" href="object.html" title="object 数据类型" rel="nofollow"><code class="literal">object</code></a> 及 <a class="xref" href="nested.html" title="nested 数据类型" rel="nofollow"><code class="literal">nested</code></a>。
</li>
<li class="listitem">
或者一种特殊的类型，如 <a class="xref" href="geo-point.html" title="geo-point 数据类型" rel="nofollow"><code class="literal">geo_point</code></a>、<a class="xref" href="geo-shape.html" title="geo-shape 数据类型" rel="nofollow"><code class="literal">geo_shape</code></a> 及 <a class="xref" href="search-suggesters.html#completion-suggester" title="完成建议" rel="nofollow"><code class="literal">completion</code></a>。
</li>
</ul>
</div>
<p>
出于不同的目的，以不同的方式索引同一个字段通常是有用的。

例如，一个<code class="literal">string</code>字段可以<a class="xref" href="mapping-index.html" title="index">索引(indexed)</a>为一个<code class="literal">text</code>字段用于全文搜索，也可以索引为一个<code class="literal">keyword</code>字段用于排序或聚合。

或者，你可以使用<a class="xref" href="analysis-standard-analyzer.html" title="Standard 分析器" rel="nofollow"><code class="literal">standard</code>分析器</a>、<a class="xref" href="analysis-lang-analyzer.html#english-analyzer" title="english 分析器" rel="nofollow"><code class="literal">english</code>分析器</a>和<a class="xref" href="analysis-lang-analyzer.html#french-analyzer" title="french 分析器" rel="nofollow"><code class="literal">french</code>分析器</a>来索引一个 string 字段。
</p>
<p>
这就是 多字段(<em>multi-fields</em>) 的目的。

大多数数据类型通过参数<a class="xref" href="multi-fields.html" title="字段" rel="nofollow"><code class="literal">fields</code></a>支持多字段。
</p>
<h3>
<a id="mapping-limit-settings"></a>防止映射爆炸的设置
</h3>
<p>在索引中定义太多字段会导致映射爆炸，从而导致内存不足错误和难以恢复的情况。</p>
<p>
考虑这样一种情况，其中插入的每个新文档都引入了新的字段，例如<a class="xref" href="dynamic-mapping.html" title="动态映射" rel="nofollow">动态映射(dynamic mapping)</a>。

每个新字段都被添加到索引的映射中，随着映射的增长，这可能会成为一个问题。
</p>
<p>使用以下设置来限制(手动或动态创建的)字段映射的数量，并防止文档导致映射爆炸：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">index.mapping.total_fields.limit</code>
</span>
</dt>
<dd>
<p>
索引中字段的最大数量。字段和对象映射以及字段别名都计入此限制。默认值为 <code class="literal">1000</code>。
</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
这个限制是为了防止映射和搜索变得太大。

较大的值可能会导致性能下降和内存问题，尤其是在负载高或资源少的集群中。
</p>
<p>
如果增加了此设置，我们建议也增加<a class="xref" href="search-settings.html" title="搜索设置" rel="nofollow"><code class="literal">indices.query.bool.max_clause_count</code></a>设置，该设置限制查询中<a class="xref" href="query-dsl-bool-query.html" title="布尔查询" rel="nofollow">布尔(bool)子句</a>的最大数量。
</p>
</div>
</div>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>如果字段映射中包含一组大型的任意键，请考虑使用<a class="xref" href="flattened.html" title="flattened 数据类型" rel="nofollow">flattened</a>数据类型。</p>
</div>
</div>
</dd>
<dt>
<span class="term">
<code class="literal">index.mapping.depth.limit</code>
</span>
</dt>
<dd>
字段的最大深度，以内部对象的数量来度量。

例如，如果所有字段都是在根对象级别定义的，那么深度就是<code class="literal">1</code>。

如果有一个对象映射，则深度为<code class="literal">2</code>，等等。默认值为<code class="literal">20</code>。
</dd>
</dl>
</div>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">index.mapping.nested_fields.limit</code>
</span>
</dt>
<dd>
索引中不同 嵌套的(<code class="literal">nested</code>) 映射的最大数量。

<code class="literal">nested</code>类型应该只在特殊情况下使用：当对象数组需要彼此独立地查询时。

为了防止映射设计不当，该设置限制了每个索引的唯一的<code class="literal">nested</code>类型的数量。

默认值为<code class="literal">50</code>。
</dd>
</dl>
</div>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">index.mapping.nested_objects.limit</code>
</span>
</dt>
<dd>
单个文档在所有<code class="literal">nested</code>类型中可以包含的嵌套(的)JSON对象的最大数量。

此限制有助于防止由于文档包含太多嵌套对象而直到内存不足的错误。

默认值为<code class="literal">10000</code>。
</dd>
<dt>
<span class="term">
<code class="literal">index.mapping.field_name_length.limit</code>
</span>
</dt>
<dd>
字段名的最大长度设置。

这个设置并不能真正解决映射爆炸的问题，但是如果你想要限制字段长度，它可能仍然有用。

通常没有必要设置这个设置。

默认设置就可以了，除非用户开始添加大量具有很长名称的字段。

默认值为<code class="literal">Long.MAX_VALUE</code> (没有限制)。
</dd>
</dl>
</div>
<h2>
<a id="_dynamic_mapping"></a>动态映射 (dynamic mapping)
</h2>
<p>
在使用之前，不需要定义字段和映射类型。

得益于<em>dynamic mapping</em>，只需对文档进行索引，新的字段名称就会自动添加。

新字段既可以添加到顶级映射类型，也可以添加到内部<a class="xref" href="object.html" title="object 数据类型" rel="nofollow"><code class="literal">object</code></a>和<a class="xref" href="nested.html" title="nested 数据类型" rel="nofollow"><code class="literal">nested</code></a>字段。
</p>
<p>
<a class="xref" href="dynamic-mapping.html" title="动态映射" rel="nofollow">动态映射</a>规则可以配置为用于定制新字段的映射。
</p>
<h2>
<a id="_explicit_mappings"></a>显式映射 (explicit mapping)
</h2>
<p>你对数据的了解要比Elasticsearch所能猜测的多得多，因此尽管动态映射在刚开始时很有用，但在某个时候你会希望显式的去指定自己的映射。</p>
<p>在<a class="xref" href="mapping.html#create-mapping" title="使用显示映射创建索引" rel="nofollow">创建索引</a>及<a class="xref" href="mapping.html#add-field-mapping" title="向已有的映射中添加字段" rel="nofollow">向已有的映射中添加字段</a>时，可以创建字段映射。</p>
<h2>
<a id="create-mapping"></a>使用显示映射创建索引
</h2>
<p>可以使用<a class="xref" href="indices-create-index.html" title="创建索引API" rel="nofollow">创建索引(create index)</a>API创建一个带有显式映射的新索引。</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  <a id="CO283-1"></a><i class="conum" data-value="1"></i>
      "email":  { "type": "keyword"  }, <a id="CO283-2"></a><i class="conum" data-value="2"></i>
      "name":   { "type": "text"  }     <a id="CO283-3"></a><i class="conum" data-value="3"></i>
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/603.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO283-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>创建一个<a class="xref" href="number.html" title="numeric 数据类型" rel="nofollow"><code class="literal">integer</code></a>类型的字段：<code class="literal">age</code></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO283-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>创建一个<a class="xref" href="keyword.html" title="keyword 数据类型" rel="nofollow"><code class="literal">keyword</code></a>类型的字段：<code class="literal">email</code></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO283-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>创建一个<a class="xref" href="text.html" title="text 数据类型" rel="nofollow"><code class="literal">text</code></a>类型的字段：<code class="literal">name</code></p>
</td>
</tr>
</table>
</div>
<h2>
<a id="add-field-mapping"></a>向已有的映射中添加字段
</h2>
<p>可以使用<a class="xref" href="indices-put-mapping.html" title="put mapping API" rel="nofollow">put mapping</a>API向已有的索引添加一个或多个新字段。
</p>
<p>
下面这个示例添加一个<a class="xref" href="mapping-index.html" title="index"><code class="literal">index</code></a>映射参数值为<code class="literal">false</code>的<code class="literal">keyword</code>类型的字段<code class="literal">employee-id</code>。

这意味着字段<code class="literal">employee-id</code>的值被存储，但是不会被索引，也就不能用于搜索。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/604.console"></div>
<h3>
<a id="update-mapping"></a>更新映射的一个字段
</h3>
<p>
除了受支持的<a class="xref" href="mapping-params.html" title="映射参数" rel="nofollow">映射参数</a>之外，不能更改现有字段的映射或字段类型。

更改已有字段可能会使已经索引的数据无效。
</p>
<p>如果需要更改字段的映射，请创建一个具有正确映射的新索引，并将数据<a class="xref" href="docs-reindex.html" title="reindex API" rel="nofollow">重新索引(reindex)</a>到该索引中。</p>
<p>
重命名一个字段会使已在旧字段名称下索引的数据失效。

相反，应该添加一个<a class="xref" href="alias.html" title="alias 数据类型" rel="nofollow"><code class="literal">alias</code></a>(别名)字段来创建备用字段名称。
</p>
<h2>
<a id="view-mapping"></a>查看一个索引的映射定义
</h2>
<p>可以使用<a class="xref" href="indices-get-mapping.html" title="get mapping API" rel="nofollow">get mapping</a>API来查看已有索引的映射。</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_mapping</pre>
</div>
<div class="console_widget" data-snippet="snippets/605.console"></div>
<p>API返回下面的响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "my-index" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "email" : {
          "type" : "keyword"
        },
        "employee-id" : {
          "type" : "keyword",
          "index" : false
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}</pre>
</div>
<h2>
<a id="view-field-mapping"></a>查看特定字段的映射
</h2>
<p>如果只想查看一个或多个特定字段的映射，可以使用<a class="xref" href="indices-get-field-mapping.html" title="get field mapping API" rel="nofollow">get field mapping</a> API。</p>
<p>如果不需要索引的完整映射，或者索引包含大量字段，这将非常有用。</p>
<p>下面这个请求检索字段<code class="literal">employee-id</code>的映射。</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_mapping/field/employee-id</pre>
</div>
<div class="console_widget" data-snippet="snippets/606.console"></div>
<p>API返回下面的响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "my-index" : {
    "mappings" : {
      "employee-id" : {
        "full_name" : "employee-id",
        "mapping" : {
          "employee-id" : {
            "type" : "keyword",
            "index" : false
          }
        }
      }
    }
  }
}</pre>
</div>
</div>
</div>





</div>
<div class="navfooter">
<span class="prev">
<a href="modules-scripting-engine.html">« 高级脚本使用脚本引擎</a>
</span>
<span class="next">
<a href="removal-of-types.html">删除的映射类型 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>